// Rust数据类型： 基本数据类型、复合类型
// Rust基本数据类型： 整型、浮点型、布尔型、字符
// Rust复合数据类型： 复合类型可以将多个值组合成一个类型。Rust 有两种基本的复合类型：元组（tuple）和数组（array）。
// 1位 即是 1bit 可以表示为0/1两种状态，是计算机系统的最小的数据单位
// 8位（bits）组成一个字节（byte），可以表示256（2^8）种不同的状态

pub fn data_type_demo() {
    println!("========== 数据类型 ==========");

    // 1、整型，默认是无符号整数，即可为负数。数字范围是 -2^(n - 1) ~ 2^(n - 1) - 1
    // 例如 i8 取值范围是 -128 ~ 127
    // 此类型声明表明它关联的值应该是占用 32 位空间的无符号整型，1位 等于 1bit 可以表示为0/1两种状态
    // （有符号整型以 i 开始，i 是英文单词 integer 的首字母，与之相反的是 u，代表无符号 unsigned 类型）
    let x = 10;
    // 手动指定数据类型为 u32 无符号类型，即不可为负数。无符号类型可以存储的数字范围是 0 ~ 2^n - 1
    // 例如 u8 取值范围是 0 ~ 255
    let a: u32 = 100;


    // 默认浮点类型是 f64，因为在现代的 CPU 中它的速度与 f32 的几乎相同，
    // 但精度更高。所有浮点型都是有符号的。
    let y = 3.14;


    // 布尔值的大小为 1 个字节，即8位（ 8bit ）
    let flag = false;
    let f: bool = false; // with explicit type annotation


    // char 字符类型，使用单引号。这与字符串字面量不同，字符串字面量是用双引号。只能表示单符号
    // Rust 的字符类型大小为 4 个字节，表示的是一个 Unicode 标量值，
    // 这意味着它可以表示的远远不止是 ASCII。标音字母，中文/日文/韩文的文字，emoji 等等
    let c = 'z';
    let d = '龙';
    let heart_eyed_cat = '😻';


    // 复合类型
    // 1、元组类型，元组是将多种类型的多个值组合到一个复合类型中的一种基本方式
    let tup = (500, 3.14, '龙');
    // 使用模式匹配来解构元组的每一个值
    let (x, y, z) = tup;
    println!("the value of y is: {}", y);
    // 通过索引来直接访问元组元素
    let five_hundred = tup.0;
    let pie = tup.1;
    let character = tup.2;
    println!("the value of tup are: {} {} {}", five_hundred, pie, character);

    // 2、数组类型，大小固定不可变
    // 与元组不同，数组的每个元素必须具有相同的类型
    let list = [1, 2, 3, 4, 5];
    let first = list[0];
    let second = list[1];
    println!("the list of first: {} and second: {}", first, second);
}

// 数据运算
pub fn data_crunching() {
    println!("========== 数据运算 ==========");

    // 加法
    let sum = 5 + 10;
    println!("{}", sum);
    // 减法
    let diff = 69.5 - 3.14;
    println!("{}", diff);
    // 乘法
    let multi = 4 * 30;
    println!("{}", multi);
    // 除法
    let division = 20 / 4;
    let division_2 = 56.7 / 32.2;
    println!("{} {}", division, division_2);
    // 取余
    let remainder = 43 % 5;
    println!("{}", remainder);
}